/ ์๊ฐ์ด๊ณผ 7
function solution2(n) {
var answer = 0;
let arr = [];
for(let i = 2;i<=n;i++){
let flag = true;
for(let j = 2;j<i;j++){
if(i%j===0){
flag = false;
break;
}
}
if(flag) arr.push(i);
}
// console.log(arr);
return arr.length;
}
// ์๊ฐ์ด๊ณผ 5๊ฐ
function solution3(n){
let arr = [];
for(let i = 2;i<=n;i++){
let flag = true;
for(const pn of arr){
if(i%pn===0){
flag = false;
break;
}
}
if(flag) arr.push(i);
}
// console.log(arr);
return arr.length;
}
function solution(n) {
let isPrime = new Array(n + 1).fill(true);
isPrime[0] = isPrime[1] = false;
for(let i = 2; i * i <= n; i++) {
if(isPrime[i]) {
for(let j = i * i; j <= n; j += i) {
isPrime[j] = false;
}
}
}
let arr = [];
for (let i=2;i<isPrime.length;i++){
if(isPrime[i]){
arr.push(i);
}
}
// console.log(arr);
return arr.length;
}
// console.log(solution(1000));
// console.log(solution(5));
console.log(solution(1000000));
๋งจ ์ฒ์ ์์ฑํ solution2๋ $O(n^2)$์ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค. n๊ฐ์ ์ ๋ ฅ๋ง๋ค i๋ฐ๋ณต๋ง๋ค j๋ฐ๋ณต์ ๋๋ฆฌ๋๊น.
๋ ๋ฒ์งธ๋ก ์์ฑํ solution3์?
- ์ผ๋จ i๋ฐ๋ณต์ด ํ๋ ์์ผ๋๊น n,
- i ๋ฐ๋ณต ์์์ arr์ ํฌ๊ธฐ๋งํผ(ํ์ฌ๊น์ง ๊ตฌํ ์์์ ์) ๋ฐ๋ณต์ ํ๋ค. (๋งค ๋ฒ ๋ฌ๋ผ์ง๋ค.) arr์ ํฌ๊ธฐ๋ ๋๋ต $n/log{n}$๊ฐ๋ผ๊ณ ํ๋ค. (n=10, 10/log10= 4๊ณ ์ค์ฌ๋ก 2,3,5,7๋ก 4๊ฐ๊ฐ ์๋ค. ๊ทธ๋์ $O(n^2/logn)$ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค. n๋ฒ ๋ฐ๋ณต๋ง๋ค n/logn๊ฐ์ ์ซ์์ ํ์ธํ๋๊น.
๋ง์ง๋ง์ผ๋ก ์์ฑํ solution์ '์๋ผํ ์คํ ๋ค์ค์ ์ฒด' ๋ฐฉ๋ฒ์ด๋ค.
- ๋ฏธ๋ฆฌ n๊น์ง์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง๋ ๋ฐฐ์ด์ ๋ง๋ค๊ณ , ๋ค true๊ฐ์ ๋ฃ์ด์ค๋ค. (n+1๊ฐ๊ฐ ๋๋ค)
- i๋ฐ๋ณต์ ํตํด ์์ ๋ฐฐ์ด์ ์ํํ๋ฉด์ ๊ฐ์ด true์ธ ๊ฒฝ์ฐ ๊ทธ index์ ๋ชจ๋ ๋ฐฐ์์ index๋ฅผ ๋ค false๋ก ๋ฐ๊ฟ์ค๋ค.
๊ทธ๋ฐ๋ฐ ๋จ์ํ 1๋ฒ๊ณผ 2๋ฒ์ ๊ณฑํ๋ ๋ฐฉ์์ด ์๋๋ผ ์กฐ๊ธ ๋ ๋ณต์กํ๊ฒ ๊ณ์ฐํด์ผํ๋ค. $\sum{n/p}$์ด๊ณ ์ด๋ $log{log{n}}$์ ์๋ ดํ๋ค๊ณ . ๊ทธ๋์ $O(log{log{n}})$๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.